package com.edt.ichannel.api.quartz;


import cc.edt.iceutils3.date.IceDateFormatUtils;
import cc.edt.iceutils3.date.IceDateOperationUtils;
import com.edt.ichannel.api.common.constant.CommonConstant;
import com.edt.ichannel.api.service.DueOutService;
import com.edt.ichannel.api.service.MonitorErrorExpansionService;
import com.edt.ichannel.api.service.SynDataService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;

@Component
@Slf4j
public class Quartz {

    @Resource
    private SynDataService synDataService;
    @Resource
    private DueOutService dueOutService;
    @Resource
    private MonitorErrorExpansionService monitorErrorExpansionService;


    @Scheduled(cron = "*/5 * * * * *")
    public void test() throws InterruptedException {
        log.info("---------------------------------测试定时任务"+new Date());
        Thread.sleep(10000);
        synDataService.testAsync();
    }

    @Scheduled(cron = "*/2 * * * * *")
    public void test1(){
        log.info("---------------------------------测试定时任务1"+new Date());
        synDataService.testAsync();
    }

    public void synMechanismsInfo() {
        synDataService.synMechanismsInfo();
    }

    /**
     * 同步人员
     */
    public void synHrStaff() {
        synDataService.synHrStaff();
    }


    /**
     * 同步日发展订单经分 D02
     */
    public void synOrderIchannel() {
        synDataService.synOrderIchannel(CommonConstant.SYN_ORDERICAHNNEL_DAY);
    }
    /**
     * 月渠道发展订单数据同步 D04
     */
    public void synOrderIchannelMonth() {
        synDataService.synOrderIchannelMonth(CommonConstant.SYN_ORDERICAHNNEL_MONTH);
    }

    /**
     * 计算发展奖 并发放
     */
    public void computBonus() {
        synDataService.computBonus(null);
        synDataService.computBonusSuperadd();
    }

    /**
     * 同步对账文件（文件没给 所以没啥用）
     */
    public void synAccountCompare() {
        synDataService.synAccountCompare(CommonConstant.SYN_SYNACCOUNTCOMPARE_DAY);
    }

    /**
     * 同步红包数据到sftp
     *
     */

    public void synRedPacketOrder() {
        synDataService.synRedPackageOrder(CommonConstant.SYN_RED_PACKET_ORDER_DAY);
    }

    /**
     * 同步红包结果到系统
     * 计算红包发放数量
     */
    public void synRedPacketOrderResult() {
        synDataService.synRedPackageOrderResult(CommonConstant.SYN_RED_PACKET_ORDER_RESULT_DAY);
        synDataService.computRedpacketCount();
    }

    /**
     *  定时器发送代发短信号码
     */
    public void sendDueOutNumber() {
        dueOutService.sendDueOutNumber();
    }

    /**
     * 月渠道发展订单数据同步 账期 格式 yyyymm 每月1号跑
     */
    public void synOrderIchannelMonthToKafKaFtp() {

        synDataService.synOrderIchannelMonthToKafKaFtp(IceDateFormatUtils.dateToString(IceDateOperationUtils.addMonths(new Date(), -1), "yyyyMM"));
    }


    /**
     * 日全量数据 D05
     */
    public void synOrderIchannelDay() {
        synDataService.synOrderIchannelDay(-1);
    }

    /**
     * 读取kafka 回执文件，并入库
     *
     * @author 孙梁
     * 2018/9/14 9:59
     */
    public void synMonthDataFromKafka() {
        synDataService.synMonthDataFromKafka(IceDateFormatUtils.dateToString(new Date(), "yyyyMM"));
    }

    /**
     * 对比文件同步过来的数据和实时接口查询的数据 如果两边数据不一致则存错误表
     *
     * @author 孙梁
     * 2018/9/14 15:42
     */
    public void compareKafkaDataAndSaveError() {
        synDataService.compareKafkaDataAndSaveError();
    }


    /**
     * 同步合伙人全量数据 D06
     */
    public void synAllExpansion() {
        synDataService.synAllExpansion(null);
    }


    /**
     *  查询成卡首充并计算佣金 佣金系定人任务，最先执行
     *  并且将数据存入order_credit
     */
    public void selectFirstrMoneyCk() {
        synDataService.selectFirstMoneyCk();
        //c流程
        synDataService.selectFirstMoneyCkC();
        synDataService.moveDataToOrderCreditCk();
    }


    /**
     * 查询宽带首充并计算佣金 佣金系定人任务，最先执行 可以和成卡一起执行，单最好岔开个十几二十分钟
     * 并且将数据存入order_credit
     */
    @Scheduled(cron = "0 0 11 * * ?")
    @Scheduled(cron = "0 1 11 * * ?")
    public void selectFirstrMoneyKd() {

        synDataService.selectFirstMoneyKd();
        //c流程
        synDataService.selectFirstMoneyKdC();
        synDataService.moveDataToOrderCreditKd();
    }


    /**
     * 移动数据到order_credit 并且发放佣金
     * 发放佣金是将计算好的佣金发放至账户，所以应该在查询佣金之后执行
     * 这么执行是为了吧所有修改账户的方法放在一个线程里执行，防止多线程修改账户出现脏读
     */
    @Scheduled(cron = "0 0 11 * * ?")
    public void moveDataToOrderCreditAndPutOutCommissiont(){
        synDataService.putOutCommissionCK();
        synDataService.putOutCommissionKd();
        synDataService.putoutCommissionBf();
        synDataService.putoutCommissionMonth();
        synDataService.putOutCommissionSuperadd();

    }

    /**
     * 在网时长补发流程，由于修改账户全部在一起，所以应该在发放之前执行，与其他线程没有关联
     */
    public void computCommissionBf() {
        synDataService.computCommissionBf();
    }


    /**
     * 同步回盘文件
     */
    public void synUnicomPyaReq() {
        synDataService.synUnicomPyaReq();
    }

    /**
     * 查询c流程成卡有userId的数据并将信息推送给统一销售平台，在查询成卡之后执行
     */
    public void selectUserIdC() {
        synDataService.selectUserIdC();
    }

    /**
     * 监控错误账户并给制定人员发送短信， 类似一个守护线程
     */
    public void monitorErrorData(){
        monitorErrorExpansionService.findErrorDataAndSendSms();
    }

    /**
     * 按月发放定时任务，应该每月执行一次 在发放前执行即可
     */
    public void computeCommissionMonth() {
        synDataService.computeCommissionMonth();

    }


    /**
     * 推送数据给放心权益中心 D07
     */

    public void synOrderIchannelDayForFXQYZX() {
        synDataService.synOrderIchannelDayForFXQYZX(-1);
    }

    public void selectFirstOrder(){
        synDataService.selectCommissionFirstOrder();
    }

    public void selectArriveOrder() {
        String monthStr = IceDateFormatUtils.dateToString(IceDateOperationUtils.addMonths(new Date(),-1),"yyyyMM");
        synDataService.selectCommissionArrive(monthStr);
    }
}
